/**
  ******************************************************************************
  * @file 
  * @brief 静态法主流程控制
  * @author luffy
  * @version V1.0.0
  * @date 2022/12/14
  ******************************************************************************
  */

#ifndef _PFC_TASK_H_
#define _PFC_TASK_H_

#include <stdint.h>
/* Public defines -----------------------------------------------------------*/
#define P_P0_LEN   20 
/* Public enum    -----------------------------------------------------------*/
enum {
    PFC_STATE_POST    = 1,
	PFC_STATE_RUN,
    PFC_STATE_IDLE,
	PFC_STATE_DEBUG,
    PFC_STATE_ERROR,
};

enum {
    PFC_CMD_MAIN    = 1,
	PFC_CMD_CAIL,
    PFC_CMD_DEBUG,
};

enum {
    CAIL_P0    = 0,
	CAIL_S1,
    CAIL_S2,
	CAIL_S3,
};

enum {
    ADSOR_INHALE    = 0,  //吸气
	ADSOR_INFALT,
};
/* Public Struct  -----------------------------------------------------------*/
typedef struct TUBE_tag
{
	uint8_t        tubeS1;               //样品管S1是否使用
	float          tubeS1Mass;           //样品管S1质量
	uint8_t        tubeS2;               //样品管S2是否使用
	float          tubeS2Mass;           //样品管S2质量
	uint8_t        tubeS3;               //样品管S3是否使用
	float          tubeS3Mass;           //样品管S3质量
} TUBE,*PTUBE;

typedef struct VACUUM_tag
{
	float          speed;                //抽气速率
	float          pumpPress;            //无限制抽气压力
	float          moleStartPress;       //分子泵启动压力
	float          moleEndPress;         //分子泵关闭压力
	uint32_t       delayTime;            //抽真空延时时间
	uint32_t       moleMinTime;          //分子泵最短时间
	uint32_t       moleMaxTime;          //分子泵最长时间
	uint32_t       detectCycle;          //漏气检测周期
	uint8_t        moleEnable;           //是否启用分子泵
	uint8_t        leakEnable;           //是否检测漏气率
} VACUUM,*PVACUUM;

typedef struct ADSORP_tag
{
	float          absPresError;         //绝对压力误差
	float          relatPresError;       //相对压力误差
	uint32_t       balanceGap;           //压力平衡间隔
	uint32_t       balanceMinTim;        //压力平衡最短时间
	uint32_t       balanceMaxTim;        //压力平衡最长时间
	uint32_t       balanceMinTim_995;    //0.995以上最短平衡时间
} ADSORP,*PADSORP;

typedef struct FREEVOLME_tag
{
	uint8_t        tubeNo;              //样品管号
	float          mormalFreeV;         //常温自由体积
	float          coldFreeV;           //冷自由体积
} FREEVOLME,*PFREEVOLME;

typedef struct ADSORPDATA_tag
{
	uint8_t        num;                 //P/Po列表号
	float          aeratRate;           //充气量
	float          PM1;                 //样品管充气前平衡压力 PM1
	float          PM3;                 //样品管充气后平衡压力 PM3
	float          roomTemp;            //环境温度
	float          lnTemp;              //液氮面温度
	float          Po;                  //Po
	float          time;                //时间戳
} ADSORPDATA,*PADSORPDATA;

typedef struct EXPERPROCTRL_tag
{
	uint8_t        airPre;              //0x00:检测大气压模块不执行 0x01:执行
	uint8_t        cailVac;             //0x00:标定抽真空模块不执行 0x01:执行
	uint8_t        normalTCail;         //0x00:常温自由体积标定模块不执行 0x01:执行
	uint8_t        coldTCail;           //0x00:冷自由体积标定不执行 0x01:执行
	uint8_t        adsorVac;            //0x00:吸脱附抽真空模块不执行 0x01:执行
	uint8_t        adsorb;              //0x00:吸脱附实验模块不执行 0x01:执行
	uint8_t        backFill;            //0x00:回填充气模块不执行 0x01:执行
} EXPERPROCTRL,*PEXPERPROCTRL;

typedef struct VALVEOFF_tag
{
	uint8_t        mechPump;            //机械泵开关 0x00:关 0x01:开
	uint8_t        molePump;            //分子泵开关 0x00:关 0x01:开
	uint8_t        valve02;             //电磁阀02开关 0x00:关 0x01:开
	uint8_t        valve04;             //电磁阀04开关 0x00:关 0x01:开
	uint8_t        valve05;             //电磁阀05开关 0x00:关 0x01:开
	uint8_t        valve07;             //电磁阀07开关 0x00:关 0x01:开
	uint8_t        valve10;             //电磁阀10开关 0x00:关 0x01:开
	uint8_t        valve11;             //电磁阀11开关 0x00:关 0x01:开
	uint8_t        valve12;             //电磁阀12开关 0x00:关 0x01:开
	uint8_t        valve13;             //电磁阀13开关 0x00:关 0x01:开
	uint8_t        valve15;             //电磁阀15开关 0x00:关 0x01:开
	uint8_t        valve21;             //电磁阀21开关 0x00:关 0x01:开
	uint8_t        valve22;             //电磁阀22开关 0x00:关 0x01:开
	uint8_t        valve24;             //电磁阀24开关 0x00:关 0x01:开
	uint8_t        valve25;             //电磁阀25开关 0x00:关 0x01:开
	uint8_t        valve26;             //电磁阀26开关 0x00:关 0x01:开
	uint8_t        valve27;	            //电磁阀27开关 0x00:关 0x01:开
} VALVEOFF,*PVALVEOFF;           

//主流程控制数据结构
typedef struct PFCCTRL_tag
{
	uint8_t        runCtrl;            //实验控制命令
	uint8_t        devState;           //设备工作状态
	uint32_t       aeratPres;          //检测大气压充气压力
	uint32_t       fillPres;           //填充压力
	float          P_Po[P_P0_LEN];     //P/Po列表
	float          airPres;            //大气压
	ADSORP         adsorb;             //吸脱附参数
	TUBE           tube;               //样品管选择
	VACUUM         caliVacuum;         //标定抽真空参数
	VACUUM         adsorVacuum;        //吸附抽真空参数
	FREEVOLME      freeV;              //自由体积
	EXPERPROCTRL   experiType;         //实验类型
	ADSORPDATA     data[P_P0_LEN];     //吸脱附实验数据
	VALVEOFF       valveOff;           //电磁阀、泵开关
} PFCCTRL,*PPFCCTRL;

//温度数据结构
typedef struct TEMP_tag
{
	float          ln;     //液氮面温度
	float          body;   //基体腔温度
	float          en;     //环境温度
} TEMP,*PTEMP;
/* Public Variable  ---------------------------------------------------------*/
//Pointer
extern  PFCCTRL        pfcCtrl;
extern  TEMP           temp;
//Array

//Const

/* Pubilc function prototypes -----------------------------------------------*/
void PFC_Init(void);
void PFC_Thread(void *pvParameters);

#endif /* _PFC_TASK_H_ */

/******************* (C) COPYRIGHT 2022 CIQTEK luffy *****END OF FILE****/
